<?php
// +----------------------------------------------------------------------
// | 简易CMS
// +----------------------------------------------------------------------
// | Copyright (C) 2010 Hoping Software Studio.
// +----------------------------------------------------------------------
// | Version $Id$
// +----------------------------------------------------------------------
namespace CMS\taglib;

use think\template\TagLib;

/**
 * OT系统标签库
 */
class Think extends TagLib {
	// 标签定义
	protected $tags = array (
			// 标签定义： attr 属性列表 close 是否闭合（0 或者1 默认1） alias 标签别名 level 嵌套层次
			'nav' => array (
					'attr' => 'field,name',
					'close' => 1
			), // 获取导航
			'query' => array (
					'attr' => 'sql,result',
					'close' => 0
			),
			'cate' => array (
					'attr' => 'id,name,limit,pid,result',
					'level' => 3
			),
			'article' => array (
					'attr' => 'id,name,cate,pid,pos,type,limit,where,order,field,result',
					'level' => 3
			),
			'value' => array (
					'attr' => 'name,table,where,type,field,filter',
					'alias' => 'max,min,avg,sum,count',
					'close' => 0
			),
			'data' => array (
					'attr' => 'name,field,limit,order,where,join,group,having,table,result,gc',
					'level' => 2
			),
			'datalist' => array (
					'attr' => 'name,field,limit,order,where,table,join,having,group,result,count,key,mod,gc',
					'level' => 3
			)
	);

	/* 导航列表 */
	public function _nav($tag, $content) {
		$tag['field'] = trim($tag['field']);
		$field = empty ($tag ['field']) ? 'true' : $tag ['field'];
		$tree = empty ( $tag ['tree'] ) ? false : true;
        $parse = <<<EOT
<?php
\$__NAV__ = S('Channel');
if(!\$__NAV__) {
    \$model = D('Channel');
    \$model = \$model->where("status=1")->order("sort")->field($field);
    \$__NAV__ = \$model->select();
    S('Channel', \$__NAV__);
}
EOT;
if ($tree) {
$parse .=<<<EOT
    \$__NAV__ = list_to_tree(\$__NAV__, "id", "pid", "_");
EOT;
}
$parse .=<<<EOT
?>
<volist name="__NAV__" id="{$tag['name']}">
    $content
</volist>
EOT;
        return $parse;
		$parse = $parse = '<?php ';
        $parse .= '$__NAV__ = S(\'Channel\');';
        $parse .= 'if(!$__NAV__) { ';
        $parse .= '$__NAV__ = M(\'Channel\')->field(' . $field . ')->where("status=1")->order("sort")->select();';
        $parse .= 'S(\'Channel\', $__NAV__);';
        $parse .= '}';
		if ($tree) {
			$parse .= '$__NAV__ = list_to_tree($__NAV__, "id", "pid", "_");';
		}
		$parse .= '?><volist name="__NAV__" id="' . $tag ['name'] . '">';
		$parse .= $content;
		$parse .= '</volist>';
		return $parse;
	}

	// sql查询
	public function _query($tag, $content) {
		$sql = $tag ['sql'];
		$result = ! empty ( $tag ['result'] ) ? $tag ['result'] : 'result';
		$parseStr = '<?php $' . $result . ' = M()->query("' . $sql . '");';
		$parseStr .= 'if($' . $result . '):?>' . $content;
		$parseStr .= "<?php endif;?>";
		return $parseStr;
	}

	// 获取字段值 包括统计数据
	// type 包括 getField count max min avg sum
	public function _value($tag, $content, $type = 'getField') {
		$name = ! empty ( $tag ['name'] ) ? $tag ['name'] : 'Document';
		$type = ! empty ( $tag ['type'] ) ? $tag ['type'] : $type;
		$filter = ! empty ( $tag ['filter'] ) ? $tag ['filter'] : '';
		$parseStr = '<?php echo ' . $filter . '(M("' . $name . '")';
		if (! empty ( $tag ['table'] )) {
			$parseStr .= '->table("' . $tag ['table'] . '")';
		}
		if (! empty ( $tag ['where'] )) {
			$tag ['where'] = $this->parseCondition ( $tag ['where'] );
			$parseStr .= '->where("' . $tag ['where'] . '")';
		}
		$parseStr .= '->' . $type . '("' . $tag ['field'] . '"));?>';
		return $parseStr;
	}
	public function _count($attr, $content) {
		return $this->_value ( $attr, $content, 'count' );
	}
	public function _sum($attr, $content) {
		return $this->_value ( $attr, $content, 'sum' );
	}
	public function _max($attr, $content) {
		return $this->_value ( $attr, $content, 'max' );
	}
	public function _min($attr, $content) {
		return $this->_value ( $attr, $content, 'min' );
	}
	public function _avg($attr, $content) {
		return $this->_value ( $attr, $content, 'avg' );
	}
	public function _data($tag, $content) {
		$name = ! empty ( $tag ['name'] ) ? $tag ['name'] : 'Document';
		$result = ! empty ( $tag ['result'] ) ? $tag ['result'] : 'article';
		$parseStr = '<?php $' . $result . ' =M("' . $name . '")->alias("__DOCUMENT")';
		if (! empty ( $tag ['table'] )) {
			$parseStr .= '->table("' . $tag ['table'] . '")';
		}
		if (! empty ( $tag ['where'] )) {
			$tag ['where'] = $this->parseCondition ( $tag ['where'] );
			$parseStr .= '->where("' . $tag ['where'] . '")';
		}
		if (! empty ( $tag ['order'] )) {
			$parseStr .= '->order("' . $tag ['order'] . '")';
		}
		if (! empty ( $tag ['join'] )) {
			$parseStr .= '->join("' . $tag ['join'] . '")';
		}
		if (! empty ( $tag ['group'] )) {
			$parseStr .= '->group("' . $tag ['group'] . '")';
		}
		if (! empty ( $tag ['having'] )) {
			$parseStr .= '->having("' . $tag ['having'] . '")';
		}
		if (! empty ( $tag ['field'] )) {
			$parseStr .= '->field("' . $tag ['field'] . '")';
		}
		$parseStr .= '->find();?>' . $content;
		if (! empty ( $tag ['gc'] )) {
			$parseStr .= '<?php unset($' . $result . ');?>';
		}
		return $parseStr;
	}
	public function _datalist($tag, $content) {
		$name = ! empty ( $tag ['name'] ) ? $tag ['name'] : 'Document';
		$result = ! empty ( $tag ['result'] ) ? $tag ['result'] : 'article';
		$key = ! empty ( $tag ['key'] ) ? $tag ['key'] : 'i';
		$mod = isset ( $tag ['mod'] ) ? $tag ['mod'] : '2';
		$count = isset ( $tag ['count'] ) ? $tag ['count'] : 'count';
		$parseStr = '<?php $_result = M("' . $name . '")->alias("__DOCUMENT")';
		if (! empty ( $tag ['table'] )) {
			$parseStr .= '->table("' . $tag ['table'] . '")';
		}
		if (! empty ( $tag ['where'] )) {
			$tag ['where'] = $this->parseCondition ( $tag ['where'] );
			$parseStr .= '->where("' . $tag ['where'] . '")';
		}
		if (! empty ( $tag ['order'] )) {
			$parseStr .= '->order("' . $tag ['order'] . '")';
		}
		if (! empty ( $tag ['join'] )) {
			$parseStr .= '->join("' . $tag ['join'] . '")';
		}
		if (! empty ( $tag ['group'] )) {
			$parseStr .= '->group("' . $tag ['group'] . '")';
		}
		if (! empty ( $tag ['having'] )) {
			$parseStr .= '->having("' . $tag ['having'] . '")';
		}
		if (! empty ( $tag ['limit'] )) {
			$parseStr .= '->limit("' . $tag ['limit'] . '")';
		}
		if (! empty ( $tag ['field'] )) {
			$parseStr .= '->field("' . $tag ['field'] . '")';
		}
		$parseStr .= '->select();if($_result):$' . $key . '=0;foreach($_result as $key=>$' . $result . '): ';
		$parseStr .= '$' . $count . ' =count($_result);';

		$parseStr .= '++$' . $key . ';$mod = ($' . $key . ' % ' . $mod . ' );?>' . $content;
		if (! empty ( $tag ['gc'] )) {
			$parseStr .= '<?php unset($' . $result . ');?>';
		}
		$parseStr .= '<?php endforeach; endif;?>';
		return $parseStr;
	}

	// 获取分类信息
	public function _cate($tag, $content) {
		$result = ! empty ( $tag ['result'] ) ? $tag ['result'] : 'cate';
		if (! empty ( $tag ['id'] )) {
			// 获取单个分类
			$parseStr = '<?php $' . $result . ' = M("Category")->find(' . $tag ['id'] . ');';
			$parseStr .= 'if($' . $result . '):?>' . $content;
		} elseif (! empty ( $tag ['name'] )) {
			// 获取单个分类
			$parseStr = '<?php $' . $result . ' = M("Category")->getByName(' . $tag ['name'] . ');';
			$parseStr .= 'if($' . $result . '):?>' . $content;
		} elseif (! empty ( $tag ['pid'] )) {
			$key = ! empty ( $tag ['key'] ) ? $tag ['key'] : 'i';
			$mod = isset ( $tag ['mod'] ) ? $tag ['mod'] : '2';
			$parseStr = '<?php $_result = M("Category")->order("sort")->where("display=1 AND status=1 AND pid=' . $tag ['pid'] . '")';
			if (! empty ( $tag ['limit'] )) {
				$parseStr .= '->limit(' . $tag ['limit'] . ')';
			}
			$parseStr .= '->select();';
			$parseStr .= 'if($_result):$' . $key . '=0;foreach($_result as $key=>$' . $result . '): ';
			$parseStr .= '++$' . $key . ';$mod = ($' . $key . ' % ' . $mod . ' );';
			$parseStr .= 'if($' . $result . '):?>' . $content . '<?php endif; endforeach;?>';
		}
		$parseStr .= "<?php endif;?>";
		return $parseStr;
	}
	public function _article($tag, $content) {
		$result = ! empty ( $tag ['result'] ) ? $tag ['result'] : 'article';
		$name = ! empty ( $tag ['name'] ) ? $tag ['name'] : 'Article';
		$order = empty ( $tag ['order'] ) ? 'level desc,create_time desc' : $tag ['order'];
		$field = empty ( $tag ['field'] ) ? '*' : $tag ['field'];
		$join = 'INNER JOIN __DOCUMENT_' . strtoupper ( $name ) . '__ ON __DOCUMENT.id = __DOCUMENT_' . strtoupper ( $name ) . '__.id';
		if (! empty ( $tag ['id'] )) { // 获取单个数据
			return $this->_data ( array (
					'name' => "Document",
					'where' => 'status=1 AND __DOCUMENT.id=' . $tag ['id'],
					'field' => $field,
					'result' => $result,
					'order' => $order,
					'join' => $join
			), $content );
		} else { // 获取数据集
			$where = 'status=1 ';

			if (! empty ( $tag ['model'] )) {
				$where .= ' AND model_id=' . $tag ['model'];
			}
			if (! empty ( $tag ['cate'] )) { // 获取某个分类的文章
				if (strpos ( $tag ['cate'], ',' )) {
					$where .= ' AND category_id IN (' . $tag ['cate'] . ')';
				} else {
					$where .= ' AND category_id=' . $tag ['cate'];
				}
			}
			if (! empty ( $tag ['pid'] )) { //
				$where .= ' AND pid = ' . $tag ['pid'];
			}
			if (! empty ( $tag ['pos'] )) {
				$where .= ' AND position =' . $tag ['pos'];
			}
			if (! empty ( $tag ['where'] )) {
				$where .= ' AND ' . $tag ['where'];
			}
			return $this->_datalist ( array (
					'name' => 'Document',
					'where' => $where,
					'field' => $field,
					'result' => $result,
					'order' => $order,
					'join' => $join,
					'limit' => ! empty ( $tag ['limit'] ) ? $tag ['limit'] : ''
			), $content );
		}
	}
}